package com.yss.common.core.enums;

import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.Arrays;

/**
 * 正则表达式
 *
 * @author lsl
 */
@Getter
@AllArgsConstructor
public enum YssRegularEnum implements BaseEnum<String> {

    DATE_TIME_REGULAR("^((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29))\\s+([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$", "yyyy-MM-dd HH:mm:ss"),

    DATE_TIME_REGULAR_1("((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})\\\\/(((0[13578]|1[02])\\\\/(0[1-9]|[12][0-9]|3[01]))|" +
            "((0[469]|11)\\\\/(0[1-9]|[12][0-9]|30))|(02\\\\/(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|" +
            "((0[48]|[2468][048]|[3579][26])00))\\\\/02\\\\/29))\\\\s([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$", "yyyy/MM/dd HH:mm:ss"),

    DATE_TIME_REGULAR_2("((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|" +
            "((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))0229))" +
            "([0-1][0-9]|2[0-3])([0-5][0-9])([0-5][0-9])$", "yyyyMMddHHmmss"),

    DATE_REGULAR("(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|" +
            "((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|" +
            "((0[48]|[2468][048]|[3579][26])00))-02-29)$", "yyyy-MM-dd"),

    DATE_REGULAR_1("(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})\\\\/(((0[13578]|1[02])\\\\/(0[1-9]|[12][0-9]|3[01]))|" +
            "((0[469]|11)\\\\/(0[1-9]|[12][0-9]|30))|(02\\\\/(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|" +
            "((0[48]|[2468][048]|[3579][26])00))\\\\/02\\\\/29)$", "yyyy/MM/dd"),

    DATE_REGULAR_2("(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|" +
            "((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|" +
            "((0[48]|[2468][048]|[3579][26])00))0229)$", "yyyyMMdd"),

    EMAIL_REGULAR("[a-zA-Z0-9]+@[a-zA-Z0-9]+\\.[a-zA-Z0-9]+", "邮箱字符串"),

    ENGLISH("^[A-Za-z]+$", "英文字母"),

    LOWER(".*[a-z_]+.*", "小写英文字母"),

    UPPER(".*[A-Z]+.*", "大写英文字母"),

    NUMBER("^-?/d+$", "整数"),

    FLOAT("^(-?/d+)(/./d+)?$", "浮点数"),

    SPECIAL("[`~!@#$^&*()=|{}':;',\\[\\].<>《》/?~！@#￥……&*（）——|{}【】‘；：”“'。，、？ ]", "特殊字符"),

    CHINESE("[\\u4e00-\\u9fa5]", "汉字");

    private final String code;
    private final String desc;

    public static YssRegularEnum getEnum(String code) {
        return Arrays.stream(values()).filter(b -> b.code == code).findFirst().orElse(null);
    }

    public static String getEnumDesc(String code) {
        YssRegularEnum e = getEnum(code);
        return e != null ? e.desc : null;
    }
//
//1.由数字、26个英文字母或者下划线组成的字符串:
//            ^[0-9a-zA-Z_]{1,}$
//2.非负整数（正整数 + 0 ）:
//            ^/d+$
//3. 正整数:
//            ^[0-9]*[1-9][0-9]*$
//4.非正整数（负整数 + 0）：
//            ^((-/d+)|(0+))$
//5. 负整数 :
//            ^-[0-9]*[1-9][0-9]*$
//6.整数:
//            ^-?/d+$
//7.非负浮点数（正浮点数 + 0）:
//            ^/d+(/./d+)?$
//8.正浮点数 :
//            ^(([0-9]+/.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*/.[0-9]+)|([0-9]*[1-9][0-9]*))$
//9. 非正浮点数（负浮点数 + 0）:
//            ^((-/d+(/./d+)?)|(0+(/.0+)?))$
//10.负浮点数 :
//            ^(-(([0-9]+/.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*/.[0-9]+)|([0-9]*[1-9][0-9]*)))$
//11. 浮点数 :
//            ^(-?/d+)(/./d+)?$
//12.由26个英文字母组成的字符串 :
//            ^[A-Za-z]+$
//13. 由26个英文字母的大写组成的字符串 :
//            ^[A-Z]+$
//14.由26个英文字母的小写组成的字符串 :
//            ^[a-z]+$
//15. 由数字和26个英文字母组成的字符串 :
//            ^[A-Za-z0-9]+$
//16.由数字、26个英文字母或者下划线组成的字符串 :
//            ^/w+$
//17.email地址 :
//            ^[/w-]+(/.[/w-]+)*@[/w-]+(/.[/w-]+)+$
//18.url:
//            ^[a-zA-z]+://(/w+(-/w+)*)(/.(/w+(-/w+)*))*(/?/S*)?$
//            19. 年-月-日:
//            /^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/
//            20.月/日/年:
//            /^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/
//            21.Emil:
//            ^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$
//22. 电话号码:
//            (d+-)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?
//            23.IP地址:
//            ^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$
//24. 匹配中文字符的正则表达式：
//            [/u4e00-/u9fa5]
//            25.匹配双字节字符(包括汉字在内)：
//            [^/x00-/xff]
//            26. 匹配空行的正则表达式：
//            /n[/s| ]*/r
//27.匹配HTML标记的正则表达式：
//            /<(.*)>.*<///1>|<(.*) //>/
//28.匹配首尾空格的正则表达式：
//            (^/s*)|(/s*$)
//            29.匹配Email地址的正则表达式：
//            /w+([-+.]/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)*
//            30. 匹配网址URL的正则表达式：
//            ^[a-zA-z]+://(//w+(-//w+)*)(//.(//w+(-//w+)*))*(//?//S*)?$
//            31. 匹配帐号是否合法(字母开头，允许5-16字节，允许字母数字下划线)：
//            ^[a-zA-Z][a-zA-Z0-9_]{4,15}$
//32. 匹配国内电话号码：
//            (/d{3}-|/d{4}-)?(/d{8}|/d{7})?
//            33.匹配腾讯QQ号：
//            ^[1-9]*[1-9][0-9]*$
//34. 只能输入数字：
//            ^[0-9]*$
//35.只能输入n位的数字：
//            ^/d{n}$
//36.只能输入至少n位的数字：
//            ^/d{n,}$
//37.只能输入m~n位的数字：
//            ^/d{m,n}$
//38.只能输入零和非零开头的数字：
//            ^(0|[1-9][0-9]*)$
//39.只能输入有两位小数的正实数：
//            ^[0-9]+(.[0-9]{2})?$
//40. 只能输入有1~3位小数的正实数：
//            ^[0-9]+(.[0-9]{1,3})?$
//41.只能输入非零的正整数：
//            ^/+?[1-9][0-9]*$
//42. 只能输入非零的负整数：
//            ^/-[1-9][0-9]*$
//43.只能输入长度为3的字符：
//            ^.{3}$
//44. 只能输入由26个英文字母组成的字符串：
//            ^[A-Za-z]+$
//45.只能输入由26个大写英文字母组成的字符串：
//            ^[A-Z]+$
//46. 只能输入由26个小写英文字母组成的字符串：
//            ^[a-z]+$
//47.只能输入由数字和26个英文字母组成的字符串：
//            ^[A-Za-z0-9]+$
//48. 只能输入由数字和26个英文字母或者下划线组成的字符串：
//            ^/w+$
//49.验证用户密码(正确格式为： 以字母开头，长度在5~17 之间，只能包含字符、数字和下划线)
//    ^[a-zA-Z]/w{5,17}$
//50.验证是否包含有 ^%&',;=?$/"等字符：
//            [^%&',;=?$/x22]+
//51.只能输入汉字：
//            ^[\u4e00-\u9fa5]{0,}$
//52、只含有汉字、数字、字母、下划线不能以下划线开头和结尾
//    ^(?!_)(?!.*?_$)[a-zA-Z0-9_\u4e00-\u9fa5]+$
//53、只含有汉字、数字、字母、下划线，下划线位置不限
//    ^[a-zA-Z0-9_\u4e00-\u9fa5]+$
//54、2~4个汉字
//    @"^[\u4E00-\u9FA5]{2,4}$
}
